﻿
#ifndef HTTP_SERVER_H
#define HTTP_SERVER_H

#define HTTPSERVER_VERSION_MAJOR 0
#define HTTPSERVER_VERSION_MINOR 1
#define HTTPSERVER_VERSION_PATCH 0

#include <QObject>
#include <QHostAddress>
#include <QObject>
#include<QNetworkReply>
#include<QNetworkRequest>
#include<QJsonObject>
#include<QJsonArray>
#include<QUrl>
#include<QJsonDocument>
#include<QMap>
#include <QMutex>
#include<QtCore/QCoreApplication>

#include "httprequest.h"
#include "httpresponse.h"
#include "httpconnection.h"

#include "taskmanager/ess_single.h"
#include "queryServer/queryserver.h"
#include "singleProject/single_project.h"
#include "queryServer/sapmsginterfacei.h"
#include "queryServer/thread/threadquery.h"

class QTcpServer;
class HttpRequest;
class HttpResponse;


//请求和响应头的表
typedef QHash<QString, QString> HeaderHash;

//状态代码
extern QHash<int, QString> STATUS_CODES;


class HttpServer : public QObject
{
	Q_OBJECT
public:
	HttpServer(QObject *parent = 0);
	virtual ~HttpServer();
    QTimer *StTimer;
    int stTimercount=0;
    int port_=0;
    QDateTime HttpOnLineTimer;
    ServerInit ServerInitItem;      //基础信息

	bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port=0);
	bool listen(quint16 port);

    bool close_();

signals:

    //创建任务信号
    void sig_SAPExcelInfo_new(SAPExcelInfo SAPExcelInfoI);

    //激光AGV状态信息
    void sig_AGVStatusWidget(QMap<QString,AGVStatus>AGVStatusMap,QMap<QString,AGVTaskStatus>AGVTaskStatusMap);

    //外层满料暂存区更新库位信号
    void sig_StationStatusUpdate(StationStatusUpdate StationStatusUpdateI);

public slots:

    //AGV任务启动状态
    void ON_AgvTaskBool(int TaskBool);

private slots:
    void newConnection();
    void ON_newReplyData_task(QString ClientIP,ReplyJson ReplyJsonI,QJsonObject ReplyJson);


    void onRequest(HttpRequest*, HttpResponse*);

    void ON_HttpServerTimer();

private:
	QTcpServer *m_tcpServer;

    //MES 创建订单任务
    ReplyJson analysReplyJson_new(QJsonObject ReplyJson_,ReplyJson ReplyJsonI);

    //PDA 通过 POST 方式获取任务状态信息
    ReplyJson analysReplyJson_taskStatus_MES(QJsonObject ReplyJson_,ReplyJson ReplyJsonI);

    //PDA 通过 POST 方式获取库位状态信息
    ReplyJson analysReplyJson_StationStatus_MES(QJsonObject ReplyJson_,ReplyJson ReplyJsonI, QString language);

    //MES 通过 GET 摄像头方式获取库位状态
    ReplyJson analysReplyJson_CameraStatus_MES(QJsonObject ReplyJson_,ReplyJson ReplyJsonI);

    //MES 通过 POST 获取库位PLC信号状态
    ReplyJson analysReplyJson_StationPLC_MES(QJsonObject ReplyJson_,ReplyJson ReplyJsonI);
    /************* SAP_transFor ************/
    QJsonObject SAP_transFor_Object(QString taskType,QMap<int, SAPExcelInfo> currentSAPExcelInfoTask);

    QJsonObject PLC_transFor_Object(QString taskType, ModbusAll ModbusAllI);




    //MES 平板放行
    ReplyJson analysReplyJson_runTask(QJsonObject ReplyJson_,ReplyJson ReplyJsonI);

    //MES 主动提交暂存位以及装机位状态信息
    deviceStatus deviceStatusItem;

    ReplyJson analysReplyJson_alterdeviceStatus(QJsonObject ReplyJson_,ReplyJson ReplyJsonI);


    ReplyJson analysReplyJson_statusAgv(QJsonObject ReplyJson_,ReplyJson ReplyJsonI);
    /************* SAP_transFor ************/
    QJsonObject AGV_transFor_Object(QString taskType,QMap<QString, AGVCurrentTask> AGVCurrentTaskMap_);




    QJsonObject ReplyJson_agvStatus;
    QJsonObject ReplyJson_taskStatus;
    QMap<QString,AGVStatus>AGVStatusMap;
    QMap<QString,AGVTaskStatus>AGVTaskStatusMap;
    //AGV状态反馈
    ReplyJson analysReplyJson_agvStatus(QJsonObject ReplyJson_,ReplyJson ReplyJsonI);

    //AGV任务状态反馈
    ReplyJson analysReplyJson_taskStatus(QJsonObject ReplyJson_,ReplyJson ReplyJsonI);


    ReplyJson ReplyJsonI_MES;
    ReplyJson currentReplyJsonI;

    QDateTime currentTimer;
    SAPExcelInfo currentSAPExcelInfoI;
    QMap<int, SAPExcelInfo>newSAPExcelInfoList;        //new MES task
    QJsonObject _ReplyJson(QString action,ReplyJson ReplyJsonI);//http 接口数据解析返回

//    QMap<int,QString>errorMsgMap;
//    QMap<int,QString>_errorMsgMap;
    ReplyJson checkTaskRepeat(SAPExcelInfo SAPExcelInfoI,ReplyJson ReplyJsonI);      //判断当前任务是否重复下达 或者有未完成的任务
    ReplyJson checkTaskRepeat_run(SAPExcelInfo SAPExcelInfoI,ReplyJson ReplyJsonI);  //判断当前任务是否可以放行


    /*************** 嘉兴南核 *************/
    sapMsgInterfaceI *_agvStaustTask;                       // AGV 状态信息任务对象
    QDateTime agvTimer;                                     // AGV 状态信息任务计时对象
    QDateTime onLineTimer;                                  // AGV 状态信息任务超时计时对象
    QString keyId_agv="";                                   // AGV 状态信息任务 ID
    void ProcesskeyId_agv();                                //获取 AGV 状态信息任务

    QMap<QString,QString>_StationQRcodeMap;                 //库位二维码容器

    threadQuery *threadQueryI;
    QThread *threadQueryItem;
    QMap<QString,deviceI>currentStationInfoMap;            //当前站点状态信息

    //更新库位状态
    void UpdateStation(QString Station, int stationStatus, QString scanCode);

    //获取库位状态
    QString GetStation(QString Station, int stationStatus, QString scanCode);

    //容器写入数据
    void Map_write();

    //接口启动、停止接收
    bool _agvTaskhttpBool = false;

};

#endif
